﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using MakeIT.MiraPark.Negocios;
using System.Text.RegularExpressions;

namespace MiraPark
{
    public partial class FormRecebePendencia : Form
    {
        CabineVO cabineVO = CabineVO.CreateCabineVO();
        UsuarioVO usuarioVO = null;

        public FormRecebePendencia()
        {
            InitializeComponent();
            this.labelPlaca.Text = "";
            this.labelOperador.Text = "";
            this.labelPendencia.Text = "";
            this.labelValor.Text = "";
            this.dateTimePickerIni.Value = DateTime.Today;
        }
        public void setCabine(CabineVO cabineVO, UsuarioVO usuarioVO)
        {
            this.cabineVO = cabineVO;
            this.usuarioVO = usuarioVO;
        }

        private void FormRecebePendencia_Load(object sender, EventArgs e)
        {
            List<FormaPagamentoVO> listFormaPagamentoVOs = ModelBO.getFormaPagamentos();
            listFormaPagamentoVOs.Add(FormaPagamentoVO.CreateFormaPagamentoVO(-1, ""));
            this.comboBoxFormaPagamento.DataSource = listFormaPagamentoVOs;
            this.comboBoxFormaPagamento.SelectedValue = -1;

            this.dataGridViewPendencia.DataSource = ModelBO.getPendencias(null,null,null,true,false,null,null);
        }

        private void buttonFecharJanela_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void dataGridViewPendencia_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            foreach (DataGridViewRow dgvr in this.dataGridViewPendencia.Rows)
            {
                int idOperador = (int)dgvr.Cells["idOperador"].Value;
                if (idOperador != -1)
                {
                    UsuarioVO usuarioVO = ModelBO.getUsuario(idOperador, false, false);
                    dgvr.Cells["operador"].Value = usuarioVO.nome;
                }
            }

        }

        private void dataGridViewPendencia_SelectionChanged(object sender, EventArgs e)
        {
            List<PendenciaVO> listPendenciaVO = (List<PendenciaVO>)this.dataGridViewPendencia.DataSource;
            PendenciaVO pendenciaVO = listPendenciaVO[this.dataGridViewPendencia.CurrentRow.Index];

            this.labelOperador.Text = (string)this.dataGridViewPendencia.CurrentRow.Cells["operador"].Value;
            this.labelPlaca.Text = (string)this.dataGridViewPendencia.CurrentRow.Cells["placa"].Value;
            this.labelPendencia.Text = pendenciaVO.pendencia;
            this.labelValor.Text = pendenciaVO.valor.ToString("#,##0.00");

            this.comboBoxFormaPagamento.SelectedValue = -1;
            this.numericUpDownRecebido.Value = pendenciaVO.valor;

            this.numericUpDownRecebido.Enabled = true;
            this.comboBoxFormaPagamento.Enabled = true;
            this.buttonReceber.Enabled = true;
        }

        private void buttonReceber_Click(object sender, EventArgs e)
        {
            StringBuilder mensagem = new StringBuilder();

            if (this.labelPlaca.Text.Length==0 && this.labelOperador.Text.Length==0)
            {
                MessageBox.Show("Informe placa ou operador", "Aviso");
                return;
            }
            if (this.comboBoxFormaPagamento.SelectedValue==null || (int)this.comboBoxFormaPagamento.SelectedValue == -1)
            {
                MessageBox.Show("Informe a Forma de pagamento", "Aviso");
                return;
            }

            DialogResult dr = MessageBox.Show(this, "Confirma o recebimento desta pendencia?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr.ToString().Equals("Yes"))
            {
                List<PendenciaVO> listPendenciaVO = (List<PendenciaVO>)this.dataGridViewPendencia.DataSource;
                PendenciaVO pendenciaVO = listPendenciaVO[this.dataGridViewPendencia.CurrentRow.Index];

                pendenciaVO.dtPagamento = dateTimePickerIni.Value;
                pendenciaVO.formaPagamentoVO = (FormaPagamentoVO)this.comboBoxFormaPagamento.SelectedItem;
                pendenciaVO.valorRec = this.numericUpDownRecebido.Value;

                DateTime dtRef = DateTime.Now;
                RecebimentoVO recebimentoVO = RecebimentoVO.CreateRecebimentoVO();
                recebimentoVO.dtPagamento = dtRef.Date;
                recebimentoVO.dtVencimento = dtRef.Date;
                recebimentoVO.idConvenio = -1;
                recebimentoVO.idMensalista = -1;
                recebimentoVO.idMovimentacao = -1;
                recebimentoVO.recebimento = "Pendência";
                recebimentoVO.valor = pendenciaVO.valor;
                recebimentoVO.valorRec = this.numericUpDownRecebido.Value;
                recebimentoVO.formaPagamentoVO = (FormaPagamentoVO)this.comboBoxFormaPagamento.SelectedItem;

                MovimentacaoVO movimentacaoVO = MovimentacaoVO.CreateMovimentacaoVO();
                movimentacaoVO.entrada = dtRef;
                movimentacaoVO.especie = MovimentacaoVO.Especie.Pendencia;
                movimentacaoVO.fechCabine = false;
                movimentacaoVO.fechConvenio = false;
                movimentacaoVO.fechDiario = false;
                movimentacaoVO.idCabineE = cabineVO.idCabine;
                movimentacaoVO.idCabineS = cabineVO.idCabine;
                movimentacaoVO.idConvenio = -1;
                movimentacaoVO.idMensalista = -1;
                movimentacaoVO.obs = "";
                movimentacaoVO.placa = "";
                movimentacaoVO.saida = dtRef;
                movimentacaoVO.ticket = -1;
                movimentacaoVO.valor = this.numericUpDownRecebido.Value;

                mensagem = new StringBuilder();
                for (int i = 0; i < 2; i++)
                {
                    mensagem.Append(Ticket.getHeader());
                    mensagem.AppendLine("<ce>RECIBO DE PENDENCIA </ce>");
                    mensagem.AppendLine("------------------------------------------------");
                    mensagem.AppendLine("Via " + (i == 0 ? "Estacionamento" : "Cliente"));
                    mensagem.AppendLine("");
                    if (this.labelOperador.Text.Length > 0)
                        mensagem.AppendLine("Operador: " + this.labelOperador.Text);
                    if (this.labelPlaca.Text.Length > 0)
                        mensagem.AppendLine("Veiculo: " + this.labelPlaca.Text);
                    mensagem.AppendLine("Referente: " + pendenciaVO.pendencia);
                    mensagem.AppendLine("Valor: " + pendenciaVO.valor.ToString("#,##0.00"));
                    mensagem.AppendLine("Data Pagamento: " + pendenciaVO.dtPagamento.Value.ToShortDateString());
                    mensagem.AppendLine("Valor Recebido: " + pendenciaVO.valorRec.ToString("#,##0.00"));
                    mensagem.AppendLine("Forma de Pagto: " + this.comboBoxFormaPagamento.SelectedItem);
                    mensagem.AppendLine("");
                    mensagem.Append(Ticket.getFooter(false,cabineVO, usuarioVO));
                }
                while (true)
                {
                    if (!Ticket.checkPrint() || !Ticket.printTicket(mensagem.ToString()))
                    {
                        DialogResult dr2 = MessageBox.Show(this, "Tentar novamente?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (dr2.ToString().Equals("Yes"))
                        {
                            continue;
                        }
                        dr2 = MessageBox.Show(this, "Deseja efetivar o recebimento da pendência sem a emissão do recibo?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (dr2.ToString().Equals("Yes"))
                        {
                            FormMessage formx = new FormMessage();
                            formx.setText(Ticket.cutText(mensagem.ToString()));
                            formx.ShowDialog(this);
                            break;
                        }
                        else
                        {
                            return;
                        }
                    }
                    else
                    {
                        break;
                    }
                }

                recebimentoVO.idMovimentacao = (int)ModelBO.newMovimentacao(movimentacaoVO);
                ModelBO.newRecebimento(recebimentoVO);
                ModelBO.setPendencia(pendenciaVO);

                MessageBox.Show("Recebimento da pendência efetuado!");
                this.Close();

            }
        }

    }
}
